home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / comm / mail / YAM23src.lha / Source / YAM_EA.c < prev    next >
C/C++ Source or Header  |  2001-05-08  |  27KB  |  650 lines

  1. /***************************************************************************
  2.  
  3.  YAM - Yet Another Mailer
  4.  Copyright (C) 1995-2000 by Marcel Beck <mbeck@yam.ch>
  5.  Copyright (C) 2000-2001 by YAM Open Source Team
  6.  
  7.  This program is free software; you can redistribute it and/or modify
  8.  it under the terms of the GNU General Public License as published by
  9.  the Free Software Foundation; either version 2 of the License, or
  10.  (at your option) any later version.
  11.  
  12.  This program is distributed in the hope that it will be useful,
  13.  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  GNU General Public License for more details.
  16.  
  17.  You should have received a copy of the GNU General Public License
  18.  along with this program; if not, write to the Free Software
  19.  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  20.  
  21.  YAM Official Support Site :  http://www.yam.ch
  22.  YAM OpenSource project    :  http://sourceforge.net/projects/yamos/
  23.  
  24.  $Id: YAM_EA.c,v 1.9 2001/05/08 22:27:37 damato Exp $
  25.  
  26. ***************************************************************************/
  27.  
  28. #include "YAM.h"
  29.  
  30. /* local protos */
  31. LOCAL int EA_Open(int);
  32. LOCAL struct EA_ClassData *EA_New(int, int);
  33.  
  34. /***************************************************************************
  35.  Module: Address book entry
  36. ***************************************************************************/
  37.  
  38. /*** Init & Open ***/
  39. /// EA_Init
  40. //  Creates and opens an address book entry window
  41. int EA_Init(int type, struct MUI_NListtree_TreeNode *tn)
  42. {
  43.    struct EA_ClassData *ea;
  44.    int winnum;
  45.    char *title = "";
  46.    if ((winnum = EA_Open(type)) < 0) return -1;
  47.    ea = G->EA[winnum];
  48.    ea->EditNode   = tn;
  49.    switch (type)
  50.    {
  51.       case AET_USER:  title = tn ? GetStr(MSG_EA_EditUser) : GetStr(MSG_AB_AddUser); break;
  52.       case AET_LIST:  title = tn ? GetStr(MSG_EA_EditList) : GetStr(MSG_AB_AddList); break;
  53.       case AET_GROUP: title = tn ? GetStr(MSG_EA_EditGroup): GetStr(MSG_AB_AddGroup);
  54.    }
  55.    set(ea->GUI.WI, MUIA_Window_Title, title);
  56.    if (!SafeOpenWindow(ea->GUI.WI)) { DisposeModulePush(&G->EA[winnum]); return -1; }
  57.    set(ea->GUI.WI, MUIA_Window_ActiveObject, ea->GUI.ST_ALIAS);
  58.    return winnum;
  59. }       
  60.  
  61. ///
  62. /// EA_Setup
  63. //  Setup GUI fields with data from adress book entry
  64. void EA_Setup(int winnum, struct ABEntry *ab)
  65. {
  66.    struct EA_GUIData *gui = &(G->EA[winnum]->GUI);
  67.    char *ptr;
  68.  
  69.    switch (ab->Type)
  70.    {
  71.       case AET_USER:        setstring(gui->ST_ALIAS, ab->Alias);
  72.                                 setstring(gui->ST_REALNAME, ab->RealName);
  73.                                 setstring(gui->ST_ADDRESS, ab->Address);
  74.                                 setstring(gui->ST_PHONE, ab->Phone);
  75.                                 setstring(gui->ST_STREET, ab->Street);
  76.                                 setstring(gui->ST_CITY, ab->City);
  77.                                 setstring(gui->ST_COUNTRY, ab->Country);
  78.                                 nnsetstring(gui->ST_PGPKEY, ab->PGPId);            // avoid triggering notification to "default security" cycle
  79.                                 setcycle(gui->CY_DEFSECURITY,ab->DefSecurity);
  80.                                 setstring(gui->ST_HOMEPAGE, ab->Homepage);
  81.                                 setstring(gui->ST_COMMENT, ab->Comment);
  82.                                 setstring(gui->ST_BIRTHDAY, AB_ExpandBD(ab->BirthDay));
  83.                                 EA_SetPhoto(winnum, ab->Photo);
  84.                                 break;
  85.       case AET_LIST:   setstring(gui->ST_ALIAS, ab->Alias);
  86.                        setstring(gui->ST_REALNAME, ab->RealName);
  87.                        setstring(gui->ST_ADDRESS, ab->Address);
  88.                        setstring(gui->ST_COMMENT, ab->Comment);
  89.                        DoMethod(gui->LV_MEMBER, MUIM_List_Clear);
  90.                        for (ptr = ab->Members; *ptr; ptr++)
  91.                        {
  92.                           char *nptr = strchr(ptr, '\n');
  93.                           if (nptr) *nptr = 0; else break;
  94.                           DoMethod(gui->LV_MEMBER, MUIM_List_InsertSingle, ptr, MUIV_List_Insert_Bottom);
  95.                           *nptr = '\n';
  96.                           ptr = nptr;
  97.                        }
  98.                        break;
  99.       case AET_GROUP:  setstring(gui->ST_ALIAS, ab->Alias);
  100.                        setstring(gui->ST_COMMENT, ab->Comment);
  101.                        break;
  102.    }
  103. }
  104. ///
  105.  
  106. /*** Private functions (member list) ***/
  107. /// EA_AddSingleMember
  108. //  Adds a single entry to the member list by Drag&Drop
  109. void EA_AddSingleMember(Object *obj, struct MUI_NListtree_TreeNode *tn)
  110. {
  111.    struct ABEntry *ab;
  112.    int dropmark;
  113.    ab = tn->tn_User;
  114.    get(obj, MUIA_List_DropMark, &dropmark);
  115.    DoMethod(obj, MUIM_List_InsertSingle, ab->Alias ? ab->Alias : ab->RealName, dropmark);
  116. }
  117.  
  118. ///
  119. /// EA_AddMembers (rec)
  120. //  Adds an entire group to the member list by Drag&Drop
  121. STACKEXT void EA_AddMembers(Object *obj, struct MUI_NListtree_TreeNode *list)
  122. {
  123.    struct MUI_NListtree_TreeNode *tn;
  124.    int i;
  125.    
  126.    for (i=0; ; i++)
  127.       if (tn = (struct MUI_NListtree_TreeNode *)DoMethod(G->AB->GUI.LV_ADRESSES, MUIM_NListtree_GetEntry, list, i, MUIV_NListtree_GetEntry_Flag_SameLevel))
  128.          if (tn->tn_Flags & TNF_LIST) EA_AddMembers(obj, tn);
  129.          else EA_AddSingleMember(obj, tn);
  130.       else break;
  131. }
  132.  
  133. ///
  134. /// EA_GetEntry
  135. //  Fills string gadget with data from selected list entry
  136. void SAVEDS ASM EA_GetEntry(REG(a1,int *arg))
  137. {
  138.    int winnum = *arg;
  139.    char *entry = NULL;
  140.    DoMethod(G->EA[winnum]->GUI.LV_MEMBER, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &entry);
  141.    if (entry) nnset(G->EA[winnum]->GUI.ST_MEMBER, MUIA_String_Contents, entry);
  142. }
  143. MakeHook(EA_GetEntryHook, EA_GetEntry);
  144.  
  145. ///
  146. /// EA_PutEntry
  147. //  Updates selected list entry
  148. void SAVEDS ASM EA_PutEntry(REG(a1,int *arg))
  149. {
  150.    struct EA_GUIData *gui = &(G->EA[*arg]->GUI);
  151.    extern struct Hook EA_AddHook;
  152.    char *buf;
  153.    int active;
  154.    
  155.    get(gui->LV_MEMBER, MUIA_List_Active, &active);
  156.    if (active == MUIV_List_Active_Off) DoMethod(G->App, MUIM_CallHook, &EA_AddHook, *arg);
  157.    else
  158.    {
  159.       get(gui->ST_MEMBER, MUIA_String_Contents, &buf);
  160.       DoMethod(gui->LV_MEMBER, MUIM_List_InsertSingle, buf, active);
  161.       DoMethod(gui->LV_MEMBER, MUIM_List_Remove, active+1);
  162.    }
  163. }
  164. MakeHook(EA_PutEntryHook, EA_PutEntry);
  165.  
  166. ///
  167. /// EA_InsertBelowActive
  168. //  Inserts an entry into the address book tree
  169. void EA_InsertBelowActive(struct ABEntry *addr, int flags)
  170. {
  171.    APTR lt = G->AB->GUI.LV_ADRESSES;
  172.    struct MUI_NListtree_TreeNode *node, *list, *res;
  173.    get(lt, MUIA_NListtree_Active, &node);
  174.    if (node == MUIV_NListtree_Active_Off)
  175.    {
  176.       res = (struct MUI_NListtree_TreeNode *)DoMethod(lt, MUIM_NListtree_Insert, addr->Alias, addr, MUIV_NListtree_Insert_ListNode_Root, MUIV_NListtree_Insert_PrevNode_Sorted, flags);
  177.    }
  178.    else
  179.    {
  180.       list = (struct MUI_NListtree_TreeNode *)DoMethod(lt, MUIM_NListtree_GetEntry, MUIV_NListtree_GetEntry_ListNode_Active, MUIV_NListtree_GetEntry_Position_Parent, 0);
  181.       res = (struct MUI_NListtree_TreeNode *)DoMethod(lt, MUIM_NListtree_Insert, addr->Alias, addr, list, node, flags);
  182.    }
  183. /*
  184.    
  185.    ULONG pred = DoMethod(lt, MUIM_NListtree_GetEntry, MUIV_NListtree_GetEntry_ListNode_Active, MUIV_NListtree_GetEntry_Position_Active, 0);
  186. */
  187.    if (res) set(lt, MUIA_NListtree_Active, res);
  188. }
  189.  
  190. ///
  191. /// EA_FixAlias
  192. //  Avoids ambiguos aliases
  193. void EA_FixAlias(struct ABEntry *ab, BOOL excludemyself)
  194. {
  195.    char alias[SIZE_NAME];
  196.    int c = 1, l, hits = 0;
  197.    struct MUI_NListtree_TreeNode *tn;
  198.    strcpy(alias, ab->Alias);
  199.    while (AB_SearchEntry(MUIV_NListtree_GetEntry_ListNode_Root, alias, ASM_ALIAS|ASM_USER|ASM_LIST|ASM_GROUP, &hits, &tn))
  200.    {
  201.       if (tn->tn_User == ab && excludemyself && hits == 1) break;
  202.       if ((l = strlen(ab->Alias)) > SIZE_NAME-2) l = SIZE_NAME-2;
  203.       sprintf(&alias[l], "%ld", ++c); hits = 0;
  204.    }
  205.    strcpy(ab->Alias, alias);
  206. }
  207.  
  208. ///
  209. /// EA_SetDefaultAlias
  210. //  Creates an alias from the real name if user left it empty
  211. void EA_SetDefaultAlias(struct ABEntry *ab)
  212. {
  213.    char *p = ab->Alias, *ln;
  214.  
  215.    clear(p, SIZE_NAME);
  216.    if (*ab->RealName)
  217.    {
  218.       if (ln = strrchr(ab->RealName, ' '))
  219.       {
  220.          if (isAlNum(ab->RealName[0])) { *p++ = ab->RealName[0]; *p++ = '_'; }
  221.          ln++;
  222.       }
  223.       else ln = ab->RealName;
  224.       for (; strlen(ab->Alias)<SIZE_NAME-2 && *ln; ln++) if (isAlNum(*ln)) *p++ = *ln;
  225.    }
  226.    else for (ln = ab->Address; strlen(ab->Alias)<SIZE_NAME-2 && *ln && *ln != '@'; ln++) if (isAlNum(*ln)) *p++ = *ln;
  227. }
  228. ///
  229.  
  230. /*** Buttons ***/
  231. /// EA_Okay
  232. //  Saves changes to the edited entry in the address book
  233. void SAVEDS ASM EA_Okay(REG(a1,int *arg))
  234. {
  235.    static struct ABEntry newaddr;
  236.    struct ABEntry *addr;
  237.    char *members, *str;
  238.    int i, winnum = *arg;
  239.    long bdate = 0;
  240.    struct EA_GUIData *gui = &(G->EA[winnum]->GUI);
  241.    BOOL old = G->EA[winnum]->EditNode != NULL;
  242.  
  243.    clear(&newaddr, sizeof(struct ABEntry));
  244.    if (G->EA[winnum]->Type)
  245.    {
  246.       get(gui->ST_ALIAS, MUIA_String_Contents, &str);
  247.       if (!*str) { ER_NewError(GetStr(MSG_ER_ErrorNoAlias), NULL, NULL); return; }
  248.    }
  249.    else
  250.    {
  251.       get(gui->ST_ADDRESS, MUIA_String_Contents, &str);
  252.       if (!*str) { ER_NewError(GetStr(MSG_ER_ErrorNoAddress), NULL, NULL); return; }
  253.       get(gui->ST_BIRTHDAY, MUIA_String_Contents, &str);
  254.       if (*str) if (!(bdate = AB_CompressBD(str))) { ER_NewError(GetStr(MSG_ER_ErrorDOBformat), NULL, NULL); return; }
  255.    }
  256.    set(gui->WI, MUIA_Window_Open, FALSE);
  257.    G->AB->Modified = TRUE;
  258.    if (old) addr = G->EA[winnum]->EditNode->tn_User; else addr = &newaddr;
  259.    GetMUIString(addr->Alias, gui->ST_ALIAS);
  260.    GetMUIString(addr->Comment, gui->ST_COMMENT);
  261.    switch (addr->Type = G->EA[winnum]->Type)
  262.    {
  263.       case AET_USER:        GetMUIString(addr->RealName, gui->ST_REALNAME);
  264.                                 GetMUIString(addr->Address, gui->ST_ADDRESS);
  265.                                 GetMUIString(addr->Phone, gui->ST_PHONE);
  266.                                 GetMUIString(addr->Street, gui->ST_STREET);
  267.                                 GetMUIString(addr->City, gui->ST_CITY);
  268.                                 GetMUIString(addr->Country, gui->ST_COUNTRY);
  269.                                 GetMUIString(addr->PGPId, gui->ST_PGPKEY);
  270.                                 GetMUIString(addr->Homepage, gui->ST_HOMEPAGE);
  271.                                 addr->DefSecurity = GetMUICycle(gui->CY_DEFSECURITY);
  272.                                 strcpy(addr->Photo, G->EA[winnum]->PhotoName);
  273.                                 addr->BirthDay = bdate;
  274.                                 if (!*addr->Alias) EA_SetDefaultAlias(addr);
  275.                                 EA_FixAlias(addr, old);
  276.                                 if (!old) EA_InsertBelowActive(addr, 0);
  277.                                 break;
  278.       case AET_LIST:  GetMUIString(addr->RealName, gui->ST_REALNAME);
  279.                       GetMUIString(addr->Address, gui->ST_ADDRESS);
  280.                       members = AllocStrBuf(SIZE_DEFAULT);
  281.                       for (i = 0; ; i++)
  282.                       {
  283.                          char *p;
  284.                          DoMethod(gui->LV_MEMBER, MUIM_List_GetEntry, i, &p);
  285.                          if (!p) break;
  286.                          members = StrBufCat(members, p);
  287.                          members = StrBufCat(members, "\n");
  288.                       }
  289.                       if (old) addr->Members = realloc(addr->Members, strlen(members)+1);
  290.                       else     addr->Members = malloc(strlen(members)+1);
  291.                       strcpy(addr->Members, members);
  292.                       EA_FixAlias(addr, old);
  293.                       if (!old)
  294.                       {
  295.                          EA_InsertBelowActive(addr, 0);
  296.                          free(addr->Members);
  297.                       }
  298.                       FreeStrBuf(members);
  299.                       break;
  300.       case AET_GROUP: EA_FixAlias(addr, old);
  301.                       if (!old) EA_InsertBelowActive(addr, TNF_LIST);
  302.    }
  303.    if (old) DoMethod(G->AB->GUI.LV_ADRESSES, MUIM_List_Redraw, MUIV_List_Redraw_All);
  304.    else AppendLogVerbose(71, GetStr(MSG_LOG_NewAddress), addr->Alias, "", "", "");
  305.    DisposeModulePush(&G->EA[winnum]);
  306. }
  307. MakeHook(EA_OkayHook, EA_Okay);
  308.  
  309. ///
  310. /// EA_AddFunc
  311. //  Adds a new entry to the member list
  312. void SAVEDS ASM EA_AddFunc(REG(a1,int *arg))
  313. {
  314.    struct EA_GUIData *gui = &(G->EA[*arg]->GUI);
  315.    char *buf;
  316.    
  317.    get(gui->ST_MEMBER, MUIA_String_Contents, &buf);
  318.    if (*buf) 
  319.    {
  320.       DoMethod(gui->LV_MEMBER, MUIM_List_InsertSingle, buf, MUIV_List_Insert_Bottom);
  321.       nnset(gui->LV_MEMBER, MUIA_List_Active, MUIV_List_Active_Off);
  322.       setstring(gui->ST_MEMBER, "");
  323.    }
  324.    set(gui->WI, MUIA_Window_ActiveObject, gui->ST_MEMBER);
  325. }
  326. MakeHook(EA_AddHook, EA_AddFunc);
  327.  
  328. ///
  329. /// EA_SetPhoto
  330. //  Updates the portrait image
  331. void EA_SetPhoto(int winnum, char *fname)
  332. {
  333.    struct EA_GUIData *gui = &(G->EA[winnum]->GUI);
  334.  
  335.    if (fname) strcpy(G->EA[winnum]->PhotoName, fname);
  336.    fname = G->EA[winnum]->PhotoName;
  337.    if (*fname) if (DoMethod(gui->GR_PHOTO, MUIM_Group_InitChange))
  338.    {
  339.       DoMethod(gui->GR_PHOTO, OM_REMMEMBER, gui->BC_PHOTO);
  340.       MUI_DisposeObject(gui->BC_PHOTO);
  341.       gui->BC_PHOTO = MakePicture(fname);
  342.       DoMethod(gui->GR_PHOTO, OM_ADDMEMBER, gui->BC_PHOTO);
  343.       DoMethod(gui->GR_PHOTO, MUIM_Group_ExitChange);
  344.    }
  345. }
  346.  
  347. ///
  348. /// EA_SelectPhotoFunc
  349. //  Lets user select an image file to be used as portrait
  350. void SAVEDS ASM EA_SelectPhotoFunc(REG(a1,int *arg))
  351. {
  352.    int winnum = *arg;
  353.  
  354.    if (ReqFile(ASL_PHOTO,G->EA[winnum]->GUI.WI, GetStr(MSG_EA_SelectPhoto_Title), 0, C->GalleryDir, ""))
  355.    {
  356.       strmfp(G->EA[winnum]->PhotoName, G->ASLReq[ASL_PHOTO]->fr_Drawer, G->ASLReq[ASL_PHOTO]->fr_File);
  357.       EA_SetPhoto(winnum, NULL);
  358.    }
  359. }
  360. MakeHook(EA_SelectPhotoHook, EA_SelectPhotoFunc);
  361.  
  362. ///
  363. /// EA_DownloadPhotoFunc
  364. //  Downloads a portrait from the YAM user gallery
  365. void SAVEDS ASM EA_DownloadPhotoFunc(REG(a1,int *arg))
  366. {
  367.    int winnum = *arg, c;
  368.    struct EA_GUIData *gui = &(G->EA[winnum]->GUI);
  369.    char *p, dbfile[SIZE_PATHFILE], *name, *addr, *homepage, newname[SIZE_DEFAULT], dbentry[5][SIZE_DEFAULT];
  370.    BOOL success = FALSE;
  371.    FILE *db;
  372.  
  373.    get(gui->ST_REALNAME, MUIA_String_Contents, &name);
  374.    get(gui->ST_ADDRESS, MUIA_String_Contents, &addr);
  375.    get(gui->ST_HOMEPAGE, MUIA_String_Contents, &homepage);
  376.    if (*addr || *name)
  377.    {
  378.       strcpy(dbfile, name);
  379.       if (p = strrchr(dbfile, ' ')) { *p = 0; sprintf(newname, "%s, %s", p+1, dbfile); }
  380.       else strcpy(newname, name);
  381.       strmfp(dbfile, C->TempDir, "gallery.db");
  382.       if (TR_OpenTCPIP())
  383.       {
  384.          Busy(GetStr(MSG_BusyDownloadingPic), name, 0, 0);
  385.          if (!(db = fopen(dbfile, "r")))
  386.             if (TR_DownloadURL(C->SupportSite, "gallery", "database", dbfile))
  387.                db = fopen(dbfile, "r");
  388.          if (db)
  389.          {
  390.             for (c = 0; GetLine(db, dbentry[c], SIZE_DEFAULT); c++) if (c == 4)
  391.             {
  392.                c = -1;
  393.                if (!stricmp(dbentry[0], name) || !stricmp(dbentry[0], newname) || !stricmp(dbentry[1], addr))
  394.                {
  395.                   if (!*name) setstring(gui->ST_REALNAME, dbentry[0]);
  396.                   if (!*addr) setstring(gui->ST_ADDRESS, dbentry[1]);
  397.                   if (!*homepage) setstring(gui->ST_HOMEPAGE, dbentry[3]);
  398.                   CreateDirectory(C->GalleryDir);
  399.                   strmfp(dbfile, C->GalleryDir, FilePart(dbentry[2]));
  400.                   if (TR_DownloadURL(C->SupportSite, "gallery", dbentry[2], dbfile)) EA_SetPhoto(winnum, dbfile);
  401.                   success = TRUE; break;
  402.                }
  403.             }
  404.             fclose(db);
  405.             if (!success) ER_NewError(GetStr(MSG_ER_NotInGallery), NULL, NULL);
  406.          }
  407.          BusyEnd;
  408.          TR_CloseTCPIP();
  409.       }
  410.       else ER_NewError(GetStr(MSG_ER_NoTCP), NULL, NULL);
  411.    }
  412. }
  413. MakeHook(EA_DownloadPhotoHook, EA_DownloadPhotoFunc);
  414.  
  415. ///
  416. /// EA_HomepageFunc
  417. //  Launches a browser to view the homepage of the person
  418. void SAVEDS ASM EA_HomepageFunc(REG(a1,int *arg))
  419. {
  420.    char *url;
  421.    get(G->EA[*arg]->GUI.ST_HOMEPAGE, MUIA_String_Contents, &url);
  422.    if (*url) GotoURL(url);
  423. }
  424. MakeHook(EA_HomepageHook, EA_HomepageFunc);
  425.  
  426. ///
  427. /// EA_Open
  428. //  Assigns a number for a new window
  429. LOCAL int EA_Open(int type)
  430. {
  431.    int winnum;
  432.    for (winnum = 0; winnum < 4; winnum++) if (!G->EA[winnum]) break;
  433.    if (winnum == 4) return -1;
  434.    if (!(G->EA[winnum] = EA_New(winnum, type))) return -1;
  435.    return winnum;
  436. }
  437. ///
  438. /// EA_CloseFunc
  439. //  Closes address book entry window
  440. void SAVEDS ASM EA_CloseFunc(REG(a1,int *arg))
  441. {
  442.    int winnum = *arg;
  443.    DisposeModulePush(&G->EA[winnum]);
  444. }
  445. MakeHook(EA_CloseHook, EA_CloseFunc);
  446. ///
  447.  
  448. /*** GUI ***/
  449. /// EA_New
  450. //  Creates address book entry window
  451. LOCAL struct EA_ClassData *EA_New(int winnum, int type)
  452. {
  453. struct EA_ClassData *data;
  454.  
  455.    if (data = calloc(1,sizeof(struct EA_ClassData)))
  456.    {
  457.         static STRPTR SecurityCycleEntries[6] = {NULL};
  458.       APTR group = NULL, bt_homepage, bt_sort;
  459.  
  460.       data->Type = type;
  461.       switch (type)
  462.       {
  463.          case AET_USER:
  464.                     /* initialize string array for cycle object on first invocation */
  465.                     if(NULL == SecurityCycleEntries[0])
  466.                     {
  467.                   int i;
  468.                     static const APTR SecurityCycleStrings[] = {MSG_WR_SecNone,MSG_WR_SecSign,MSG_WR_SecEncrypt,MSG_WR_SecBoth,MSG_WR_SecAnon};
  469.  
  470.                         for(i=0; i<5; i++) SecurityCycleEntries[i] = GetStr(SecurityCycleStrings[i]);
  471.                     }
  472.  
  473.                     /* build MUI object tree */
  474.                     group = HGroup,
  475.                MUIA_Group_SameWidth, TRUE,
  476.                Child, VGroup,
  477.                   Child, ColGroup(2), GroupFrameT(GetStr(MSG_EA_ElectronicMail)),
  478.                      Child, Label2(GetStr(MSG_EA_Alias)),
  479.                      Child, data->GUI.ST_ALIAS = MakeString(SIZE_NAME,GetStr(MSG_EA_Alias)),
  480.                      Child, Label2(GetStr(MSG_EA_RealName)),
  481.                      Child, data->GUI.ST_REALNAME = MakeString(SIZE_REALNAME,GetStr(MSG_EA_RealName)),
  482.                      Child, Label2(GetStr(MSG_EA_EmailAddress)),
  483.                      Child, data->GUI.ST_ADDRESS  = MakeString(SIZE_ADDRESS,GetStr(MSG_EA_EmailAddress)),
  484.                      Child, Label2(GetStr(MSG_EA_PGPId)),
  485.                      Child, MakePGPKeyList(&(data->GUI.ST_PGPKEY), FALSE, GetStr(MSG_EA_PGPId)),
  486.                      Child, Label2(GetStr(MSG_EA_Homepage)),
  487.                      Child, HGroup,
  488.                         MUIA_Group_HorizSpacing, 1,
  489.                         Child, data->GUI.ST_HOMEPAGE = MakeString(SIZE_URL,GetStr(MSG_EA_Homepage)),
  490.                         Child, bt_homepage = PopButton(MUII_TapeRecord),
  491.                      End,
  492.                             Child, Label2(GetStr(MSG_EA_DefSecurity)),
  493.                             Child, data->GUI.CY_DEFSECURITY = CycleObject,
  494.                                 MUIA_Cycle_Entries, SecurityCycleEntries,
  495.                             End,
  496.                   End,
  497.                   Child, ColGroup(2), GroupFrameT(GetStr(MSG_EA_SnailMail)),
  498.                      Child, Label2(GetStr(MSG_EA_Street)),
  499.                      Child, data->GUI.ST_STREET = MakeString(SIZE_DEFAULT,GetStr(MSG_EA_Street)),
  500.                      Child, Label2(GetStr(MSG_EA_City)),
  501.                      Child, data->GUI.ST_CITY = MakeString(SIZE_DEFAULT,GetStr(MSG_EA_City)),
  502.                      Child, Label2(GetStr(MSG_EA_Country)),
  503.                      Child, data->GUI.ST_COUNTRY = MakeString(SIZE_DEFAULT,GetStr(MSG_EA_Country)),
  504.                      Child, Label2(GetStr(MSG_EA_Phone)),
  505.                      Child, data->GUI.ST_PHONE = MakeString(SIZE_DEFAULT,GetStr(MSG_EA_Phone)),
  506.                   End,
  507.                End,
  508.                Child, VGroup,
  509.                   Child, ColGroup(2), GroupFrameT(GetStr(MSG_EA_Miscellaneous)),
  510.                      Child, Label2(GetStr(MSG_EA_Description)),
  511.                      Child, data->GUI.ST_COMMENT = MakeString(SIZE_DEFAULT,GetStr(MSG_EA_Description)),
  512.                      Child, Label2(GetStr(MSG_EA_DOB)),
  513.                      Child, data->GUI.ST_BIRTHDAY = MakeString(SIZE_SMALL,GetStr(MSG_EA_DOB)),
  514.                   End,
  515.                   Child, VGroupV, GroupFrameT(GetStr(MSG_EA_Portrait)),
  516.                      Child, ColGroup(2),
  517.                         Child, data->GUI.BT_SELECTPHOTO = MakeButton(GetStr(MSG_EA_SelectPhoto)),
  518.                         Child, data->GUI.BT_LOADPHOTO = MakeButton(GetStr(MSG_EA_LoadPhoto)),
  519.                      End,
  520.                      Child, HGroup,
  521.                         Child, HSpace(0),
  522.                         Child, data->GUI.GR_PHOTO = HGroup,
  523.                            Child, data->GUI.BC_PHOTO = RectangleObject, MUIA_FixWidth, 100, MUIA_FixHeight, 80, End,
  524.                            ImageButtonFrame,
  525.                         End,
  526.                         Child, HSpace(0),
  527.                      End,
  528.                      Child, VSpace(0),
  529.                   End,
  530.                End,
  531.             End; 
  532.             if (group) 
  533.             {
  534.                set(data->GUI.BT_LOADPHOTO, MUIA_Disabled, !*C->GalleryDir);
  535.                SetHelp(data->GUI.ST_REALNAME   ,MSG_HELP_EA_ST_REALNAME   );
  536.                SetHelp(data->GUI.ST_ADDRESS    ,MSG_HELP_EA_ST_ADDRESS    );
  537.                SetHelp(data->GUI.ST_PGPKEY     ,MSG_HELP_EA_ST_PGPKEY     );
  538.                SetHelp(data->GUI.ST_HOMEPAGE   ,MSG_HELP_EA_ST_HOMEPAGE   );
  539.                SetHelp(data->GUI.CY_DEFSECURITY,MSG_HELP_MA_CY_DEFSECURITY);
  540.                SetHelp(data->GUI.ST_STREET     ,MSG_HELP_EA_ST_STREET     );
  541.                SetHelp(data->GUI.ST_CITY       ,MSG_HELP_EA_ST_CITY       );
  542.                SetHelp(data->GUI.ST_COUNTRY    ,MSG_HELP_EA_ST_COUNTRY    );
  543.                SetHelp(data->GUI.ST_PHONE      ,MSG_HELP_EA_ST_PHONE      );
  544.                SetHelp(data->GUI.ST_BIRTHDAY   ,MSG_HELP_EA_ST_BIRTHDAY   );
  545.                SetHelp(data->GUI.BC_PHOTO      ,MSG_HELP_EA_BC_PHOTO      );
  546.                SetHelp(data->GUI.BT_SELECTPHOTO,MSG_HELP_EA_BT_SELECTPHOTO);
  547.                SetHelp(data->GUI.BT_LOADPHOTO  ,MSG_HELP_EA_BT_LOADPHOTO  );
  548.  
  549.                DoMethod(data->GUI.BT_SELECTPHOTO, MUIM_Notify, MUIA_Pressed, FALSE, MUIV_Notify_Application, 3, MUIM_CallHook, &EA_SelectPhotoHook, winnum);
  550.                DoMethod(data->GUI.BT_LOADPHOTO,   MUIM_Notify, MUIA_Pressed, FALSE, MUIV_Notify_Application, 3, MUIM_CallHook, &EA_DownloadPhotoHook, winnum);
  551.  
  552.                     // when a key ID is selected, set default security to "encrypt"
  553.                     DoMethod(data->GUI.ST_PGPKEY, MUIM_Notify, MUIA_String_Contents, MUIV_EveryTime, data->GUI.CY_DEFSECURITY, 3, MUIM_Set, MUIA_Cycle_Active, 2);
  554.  
  555.                DoMethod(bt_homepage, MUIM_Notify, MUIA_Pressed, FALSE, MUIV_Notify_Application, 3, MUIM_CallHook, &EA_HomepageHook, winnum);
  556.             }
  557.             break;
  558.          case AET_GROUP: group = ColGroup(2), GroupFrame,
  559.                MUIA_Background, MUII_GroupBack,
  560.                Child, Label2(GetStr(MSG_EA_Alias)),
  561.                Child, data->GUI.ST_ALIAS = MakeString(SIZE_NAME,GetStr(MSG_EA_Alias)),
  562.                Child, Label2(GetStr(MSG_EA_Description)),
  563.                Child, data->GUI.ST_COMMENT = MakeString(SIZE_DEFAULT,GetStr(MSG_EA_Description)),
  564.             End; break;
  565.          case AET_LIST: group = HGroup,
  566.                MUIA_Group_SameWidth, TRUE,
  567.                Child, VGroup,
  568.                   Child, ColGroup(2), GroupFrameT(GetStr(MSG_EA_ElectronicMail)),
  569.                      MUIA_Background, MUII_GroupBack,
  570.                      Child, Label2(GetStr(MSG_EA_Alias)),
  571.                      Child, data->GUI.ST_ALIAS = MakeString(SIZE_NAME,GetStr(MSG_EA_Alias)),
  572.                      Child, Label2(GetStr(MSG_EA_ReturnAddress)),
  573.                      Child, data->GUI.ST_ADDRESS = MakeString(SIZE_ADDRESS,GetStr(MSG_EA_ReturnAddress)),
  574.                      Child, Label2(GetStr(MSG_EA_MLName)),
  575.                      Child, data->GUI.ST_REALNAME = MakeString(SIZE_REALNAME,GetStr(MSG_EA_MLName)),
  576.                      Child, Label2(GetStr(MSG_EA_Description)),
  577.                      Child, data->GUI.ST_COMMENT = MakeString(SIZE_DEFAULT,GetStr(MSG_EA_Description)),
  578.                   End,
  579.                   Child, VSpace(0),
  580.                End,
  581.                Child, VGroup, GroupFrameT(GetStr(MSG_EA_Members)),
  582.                   Child, ListviewObject,
  583.                      MUIA_CycleChain, 1,
  584.                      MUIA_Listview_DragType, 1,
  585.                      MUIA_Listview_List, data->GUI.LV_MEMBER = NewObject(CL_DDList->mcc_Class,NULL,
  586.                         InputListFrame,
  587.                         MUIA_List_DragSortable ,TRUE,
  588.                         MUIA_List_ConstructHook,MUIV_List_ConstructHook_String,
  589.                         MUIA_List_DestructHook ,MUIV_List_DestructHook_String,
  590.                      End,
  591.                   End,
  592.                   Child, data->GUI.ST_MEMBER = MakeString(SIZE_ADDRESS,""),
  593.                   Child, ColGroup(3), GroupSpacing(0),
  594.                      Child, data->GUI.BT_ADD = MakeButton(GetStr(MSG_Add)),
  595.                      Child, data->GUI.BT_DEL = MakeButton(GetStr(MSG_Del)),
  596.                      Child, bt_sort          = MakeButton(GetStr(MSG_EA_Sort)),
  597.                   End,
  598.                End,
  599.             End; 
  600.             if (group)
  601.             {
  602.                SetHelp(data->GUI.ST_ALIAS   ,MSG_HELP_EA_ST_ALIAS      );
  603.                SetHelp(data->GUI.ST_COMMENT ,MSG_HELP_EA_ST_DESCRIPTION);
  604.                SetHelp(data->GUI.ST_REALNAME,MSG_HELP_EA_ST_REALNAME_L );
  605.                SetHelp(data->GUI.ST_ADDRESS ,MSG_HELP_EA_ST_ADDRESS_L  );
  606.                SetHelp(data->GUI.LV_MEMBER  ,MSG_HELP_EA_LV_MEMBERS    );
  607.                SetHelp(data->GUI.ST_MEMBER  ,MSG_HELP_EA_ST_MEMBER     );
  608.                SetHelp(data->GUI.BT_ADD     ,MSG_HELP_EA_BT_ADD        );
  609.                SetHelp(data->GUI.BT_DEL     ,MSG_HELP_EA_BT_DEL        );
  610.                SetHelp(bt_sort              ,MSG_HELP_EA_BT_SORT       );
  611.                DoMethod(data->GUI.BT_ADD   ,MUIM_Notify,MUIA_Pressed            ,FALSE         ,MUIV_Notify_Application,3,MUIM_CallHook   ,&EA_AddHook,winnum);
  612.                DoMethod(data->GUI.BT_DEL   ,MUIM_Notify,MUIA_Pressed            ,FALSE         ,data->GUI.LV_MEMBER,2,MUIM_List_Remove,MUIV_List_Remove_Active);
  613.                DoMethod(bt_sort            ,MUIM_Notify,MUIA_Pressed            ,FALSE         ,data->GUI.LV_MEMBER,1,MUIM_List_Sort);
  614.                DoMethod(data->GUI.ST_MEMBER,MUIM_Notify,MUIA_String_Acknowledge ,MUIV_EveryTime,MUIV_Notify_Application,3,MUIM_CallHook   ,&EA_PutEntryHook,winnum);
  615.                DoMethod(data->GUI.LV_MEMBER,MUIM_Notify,MUIA_List_Active        ,MUIV_EveryTime,MUIV_Notify_Application,3,MUIM_CallHook   ,&EA_GetEntryHook,winnum);
  616.             }
  617.             break;
  618.       }
  619.       data->GUI.WI = WindowObject,
  620.          MUIA_Window_Title, "",
  621.          MUIA_HelpNode, "EA_W",
  622.          MUIA_Window_ID, MAKE_ID('E','D','A','D'),
  623.          WindowContents, VGroup,
  624.             Child, group,
  625.             Child, ColGroup(3),
  626.                Child, data->GUI.BT_OKAY   = MakeButton(GetStr(MSG_Okay)),
  627.                Child, HSpace(0),
  628.                Child, data->GUI.BT_CANCEL = MakeButton(GetStr(MSG_Cancel)),
  629.             End,
  630.          End,
  631.       End;
  632.      if (data->GUI.WI)
  633.      {
  634.          DoMethod(G->App, OM_ADDMEMBER, data->GUI.WI);
  635.          SetHelp(data->GUI.ST_ALIAS   ,MSG_HELP_EA_ST_ALIAS      );
  636.          SetHelp(data->GUI.ST_COMMENT ,MSG_HELP_EA_ST_DESCRIPTION);
  637.          SetHelp(data->GUI.BT_OKAY    ,MSG_HELP_EA_BT_OKAY       );
  638.          SetHelp(data->GUI.BT_CANCEL  ,MSG_HELP_EA_BT_CANCEL     );
  639.          set(data->GUI.ST_BIRTHDAY, MUIA_String_Accept, "0123456789-AaBbCcDdEeFfGgJjLlMmNnOoPpRrSsTtUuVvYy");
  640.          DoMethod(data->GUI.BT_CANCEL,MUIM_Notify,MUIA_Pressed            ,FALSE         ,MUIV_Notify_Application,3,MUIM_CallHook,&EA_CloseHook,winnum);
  641.          DoMethod(data->GUI.BT_OKAY  ,MUIM_Notify,MUIA_Pressed            ,FALSE         ,MUIV_Notify_Application,3,MUIM_CallHook,&EA_OkayHook,winnum);
  642.          DoMethod(data->GUI.WI       ,MUIM_Notify,MUIA_Window_CloseRequest,TRUE          ,MUIV_Notify_Application,3,MUIM_CallHook,&EA_CloseHook,winnum);
  643.          return data;
  644.       }
  645.       free(data);
  646.    }
  647.    return NULL;
  648. }
  649. /// vi: set tabsize=3:
  650.